package Thread;


import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 *
 * 1.方法解读：
 *         final native boolean compareAndSwapInt(Object o, long offset, int expected,int x)
 *        方法的作用是，读取传入对象o在内存中偏移量为offset位置的值与期望值expected作比较。相等就把x值赋值给offset位置的值。方法返回true。不相等，就取消赋值，方法返回false。
 *        这也是CAS的思想，及比较并交换。用于保证并发时的无锁并发的安全性。
 *
 *
 *        Unsafe类真牛逼，可以获取某个对象成员变量在class文件里面的偏移量。
 *        compareAndSwapInt 可以通过比较并交换来修改这个偏移量值。
 *
 */
public class Unsafe_Study {

        public int value = 10;


    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        //通过反射获得Unsafe实例，仅BootstrapClassLoader加载的类
        //（$JAVA_HOME/lib目录下jar包包含的类，如java.util.concurrent.atomic.AtomicInteger）
        //才能通过Unsafe.getUnsafe静态方法获取
        Field field = Unsafe.class.getDeclaredField("theUnsafe");
        field.setAccessible(true);
        Unsafe unsafe = (Unsafe) field.get(null);
        //获得Target实例域value
        Field valueField = Unsafe_Study.class.getDeclaredField("value");
        //实例化Target
        Unsafe_Study t = new Unsafe_Study();
        System.out.println("原始value值:" + valueField.get(t));

        //获得实例域在class文件里的偏移量
        final long valueOffset = unsafe.objectFieldOffset(valueField);

        //第一次swap
        System.out.println("第一次swap(10,20)函数返回值:" + unsafe.compareAndSwapInt(t, valueOffset, 10, 20));
        System.out.println("第一次swap(10,20)后value值:" + valueField.get(t));

        //第二次swap
        System.out.println("第一次swap(10,20)函数返回值:" + unsafe.compareAndSwapInt(t, valueOffset, 10, 20));
        System.out.println("第一次swap(10,20)后value值:" + valueField.get(t));

    }

}
